home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_100
/
184_01
/
yanc.c
< prev
next >
Wrap
Text File
|
1980-01-01
|
24KB
|
1,121 lines
/* YANC version 1.0 -- Yet Another New Catalog program */
/* Master disk catalog system */
/* Based on the original catalog programs by Ward Christensen */
/* (FMAP, UCAT, CAT, and QCAT) */
/* and incorporating revisions by Lewis Moseley, Jr. */
/* (NEWCAT and CROSSREF) */
/* Rewritten into a single C program for ease of maintainance. */
/* Menu-driven and extended for ease of use. */
/* Written by Ken Presser */
/* Converted to BDS-C by David Welch */
/* 06/15/83, Minor corrections and alterations, J.E. Byram */
/* Original C dialect...CW/C from The Code Works */
/* Current C dialect...BDS-C from BD Software */
#include "bdscio.h"
#define LISTCHAR 5 /* bdos function list char to printer */
#define RETURNVER 12 /* bdos function return version no */
#define RESETDISK 13 /* bdos function reset disk system */
#define SELDISK 14 /* bdos function select disk */
#define SRCHFIRST 17 /* bdos function search for first */
#define SRCHNEXT 18 /* bdos function search for next */
#define DELETEFILE 19 /* bdos function delete file */
#define RENAMEFILE 23 /* bdos function rename file */
#define GETDISK 25 /* bdos function get current disk */
#define SETDMA 26 /* bdos function set dma addr */
#define GETALLOC 27 /* bdos function get addr (alloc) */
#define GETDPB 31 /* bdos function get disk parameter *
* block address */
#define FCBSIZE 16 /* cpm directory entry size */
#define NUMDRIVES 16 /* number of cpm drives */
#define DIRSIZ 256 /* max # of cpm dir entries */
#define DMADDR 0x80 /* bdos default dma addr */
#define MAXLINES 60 /* max lines before sending FF */
#define FF 0x0c /* form feed character */
#define CR 0x0d /* carriage return character */
#define ESC 0x1b /* escape */
#define YES TRUE
#define NO FALSE
#define EOS NO
#define BOOLEAN int
#define GETS_SIZE 128
#define UP 0xC1
#define DOWN 0xC2
#define HOME 0xC8
int printer;
char mdrive,ddrive;
char *pfcb[DIRSIZ],volname[12],ibuffer[BUFSIZ],obuffer[BUFSIZ];
int nfcb,cfcb,block,remsz,disksz,dirmax,linecount,itemcount;
struct dontcat {
char fname[13];
struct dontcat *next;
} *dcs;
struct dontcat *head;
main()
{
int i,cmd;
char matchstr[GETS_SIZE];
if (bdos(RETURNVER,0) == 0) {
puts("Can't use this program with CP/M 1.4");
exit();
}
mdrive = 'A';
ddrive = 'B';
printer = NO;
while (1) {
cmd = menu();
switch (cmd) {
case 1: updatedir();
break;
case 2: strcpy(matchstr,"*.*");
listmast(matchstr);
break;
case 3: getstr(matchstr);
listmast(matchstr);
break;
case 4: getstr(matchstr);
listvol(matchstr);
break;
case 5: dispdir();
break;
case 6: initmast();
break;
case 7: getdefaults();
break;
case 8: makedirfile();
break;
case 9: exit();
break;
}
}
}
menu()
{
char x,y;
char c;
int i;
clear();
gotoxy(29,0);
printf("Master Catalog System");
gotoxy(5,2);
printf("Defaults: ");
printf("Master Catalog on drive %c:",mdrive);
printf(" Disk to Add on drive %c:",ddrive);
gotoxy(16,3);
printf("Printer: ");
if (printer)
printf("on");
else printf("off");
gotoxy(16,5);
printf("...use arrow keys to move cursor to selection...");
gotoxy(17,7); revvid(); putchar(' '); norvid(); gotoxy(21,7);
printf("1) Update the master catalog with above defaults");
gotoxy(17,9); revvid(); putchar(' '); norvid(); gotoxy(21,9);
printf("2) List the entire master catalog");
gotoxy(17,11); revvid(); putchar(' '); norvid(); gotoxy(21,11);
printf("3) List specific files with a match key");
gotoxy(17,13); revvid(); putchar(' '); norvid(); gotoxy(21,13);
printf("4) List a volume from the master catalog");
gotoxy(17,15); revvid(); putchar(' '); norvid(); gotoxy(21,15);
printf("5) List the disk directory");
gotoxy(17,17); revvid(); putchar(' '); norvid(); gotoxy(21,17);
printf("6) Initialize MAST.CAT");
gotoxy(17,19); revvid(); putchar(' '); norvid(); gotoxy(21,19);
printf("7) Update the defaults");
gotoxy(17,21); revvid(); putchar(' '); norvid(); gotoxy(21,21);
printf("8) Make directory volume label file");
gotoxy(17,23); revvid(); putchar(' '); norvid(); gotoxy(21,23);
printf("9) Quit this program");
gotoxy(17,7);
while (1) {
c = hinchar();
switch (c) {
case UP: getxy(&x,&y);
if (y == 7) break;
y = y - 2;
gotoxy(x,y);
break;
case DOWN: getxy(&x,&y);
if (y == 23) break;
y = y + 2;
gotoxy(x,y);
break;
case HOME: gotoxy(17,7);
break;
case CR: getxy(&x,&y);
clear();
x = y/2-2;
if ( x<1 || x>9 )
abort("Invalid menu response = %d"
,x);
return x;
break;
}
}
}
updatedir()
{
char *top;
top = alloc(1);
printf("\r\nInsert disk to be cataloged in %c:\r\n",ddrive);
if (mdrive != ddrive)
printf("Be sure the master disk is in %c:\r\n",mdrive);
hold();
readdir();
if (strcmp(volname,"n/a"))
updatemast();
else {
printf("No volume label file on disk\r\n");
hold();
}
free(top);
}
dispdir()
{
printf("Load disk to list in drive %c: ",ddrive);
hold();
puts("\r\nReading directory...\r\n\n");
readdir();
listdir();
}
readdir()
{
char fcb[FCBSIZE];
char dmapos;
BOOLEAN firstime;
char *alloc;
char *ptr,bsh;
int i;
bdos(RESETDISK,0);
bdos(SELDISK,(ddrive-'A'));
bdos(SETDMA,DMADDR);
ptr = bdos(GETDPB,0);
ptr += 2;
bsh = *ptr;
block = 1 << (bsh-3);
ptr += 3;
disksz = ((*ptr++)+(*ptr++)*256)*block-block;
remsz = disksz;
dirmax = (*ptr+(*(ptr+1)*256))+1;
firstime = YES;
for (i=0; i<13; i++)
fcb[i] = '?';
for (i=13; i<FCBSIZE; i++)
fcb[i] = '\0';
nfcb = 0;
volname[0] = 'n';
volname[1] = '/';
volname[2] = 'a';
volname[3] = EOS;
while (1) {
dmapos = bdos(firstime ? SRCHFIRST : SRCHNEXT,fcb);
if (dmapos == 255) break;
firstime = NO;
remsz -= copyentry(DMADDR + 32*(dmapos%4));
}
}
copyentry(fcb)
char *fcb;
{
int i,j,val;
char *ptr;
if ((*fcb < 32) && (*(fcb+1) != '-')) {
ptr = fcb + 1;
for (i=0; i<11; i++) {
*ptr = (*ptr) & 0x7f;
++ptr;
}
for (i=0; i<nfcb; i++) {
val = comparefcb(pfcb[i],fcb);
switch (val) {
case -2: break;
case -1: return copyfcb(i,fcb);
break;
case 0: abort("duplicate directory entry\r\n");
break;
case 1: return (*(fcb+15)/(8*block)*block +
((*(fcb+15)%(8*block)>0)*block));
break;
case 2: for (j=nfcb++; j>i; j--)
pfcb[j] = pfcb[j-1];
pfcb[i] = alloc(FCBSIZE);
return copyfcb(i,fcb);
break;
}
}
i = nfcb++;
pfcb[i] = alloc(FCBSIZE);
return copyfcb(i,fcb);
}
else if ((*fcb < 32) && (*(fcb+1) == '-')) {
j = 0;
for (i=2; i<9; i++)
volname[j++] = fcb[i];
volname[j++] = ' ';
for (i=9; i<12; i++)
volname[j++] = fcb[i];
volname[j] = EOS;
return 0;
}
else return 0;
}
copyfcb(ptr,fcb)
char *fcb;
int ptr;
{
char *tfcb,*sfcb;
int i;
tfcb = sfcb = pfcb[ptr];
for (i=0; i<FCBSIZE; i++)
*tfcb++ = *fcb++;
return (*(sfcb+15)/(8*block)*block +
((*(sfcb+15)%(8*block)>0)*block));
}
comparefcb(fcb1,fcb2)
char *fcb1,*fcb2;
/* Compare two fcb's -- return: *
* -2 name1,user1 < name2,user2 *
* -1 name1,user1 = name2,user2 & extent1 < extent2; *
* 0 name1,user1,extent1 = name2,user2,extent2; *
* +1 name1,user1 = name2,user2 & extent1 > extent2; *
* +2 name1,user1 > name2,user2; */
{
char s1[14],s2[14];
int i,k,val;
for (i=0,k=1; k<12; i++,k++) {
s1[i] = fcb1[k];
s2[i] = fcb2[k];
}
s1[i] = fcb1[0] + '0';
s2[i] = fcb2[0] + '0';
i++;
s1[i] = EOS;
s2[i] = EOS;
val = strcmp(s1,s2);
if (val < 0)
return -2;
else if (val > 0)
return 2;
else
if (fcb1[12] < fcb2[12])
return -1;
else if (fcb1[12] > fcb2[12])
return 1;
else return 0;
}
listdir()
{
int i,j,k,size;
char s[50],stemp[5];
char *fcb;
sprintf(s," Directory for Volume: %s\r\n",volname);
printf("%s",s);
if (printer) {
bdos(LISTCHAR,FF);
for (i=0; i<strlen(s); i++)
bdos(LISTCHAR,s[i]);
}
f